package com.cy.jt.security.config.controller;

import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import sun.plugin.liveconnect.SecurityContextHelper;

/**
 * 可以将这里的Controller看成系统内部的一个资源对象，我们要求访问此对象中的方法时
 * 需要进行权限检查。
 */
@RestController
public class ResourceController {
    //@PreAuthorize注解用于描述在访问方法时首先要对用户是否有访问该方法的权限进行检验

    //1.添加操作
    //@PreAuthorize("hasRole('admin')")//登录用户具备admin这个角色才可以访问
    @PreAuthorize("hasAnyAuthority('sys:res:create')") //登录用户具备sys:res:create权限才能访问资源
    @RequestMapping("/doCreate")
    public String doCreate(){
        return "insert resource  data Ok!";
    }
    //2.查询操作
    @PreAuthorize("hasAnyAuthority('sys:res:retrieve')")
    @RequestMapping("/doRetrieve")
    public String doRetrieve(){
        return "select resource  data Ok!";
    }

    //3.更新操作
    @PreAuthorize("hasAnyAuthority('sys:res:update')")
    @RequestMapping("/doUpdate")
    public String doUpdate(){
        return "update resource data Ok!";
    }

    //4.删除操作
    @PreAuthorize("hasAnyAuthority('sys:res:delete')")
    @RequestMapping("/doDelete")
    public String doDelete(){
        return  "delete resource data Ok!";
    }

    /**
     * 获取登录用户信息
     * @return
     */
    @GetMapping("/doGetUser")
    public String doGetUser(){
        //从Session中获取用户认证信息
        //1)Authentication 认证对象（封装了登录用户信息的对象）
        //2）SecurityContextHolder 持有登录状态的信息的对象（底层可通过session获取用户信息）
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        //基于认证对象获取用户身份信息
        User principal =  (User) authentication.getPrincipal();//获取资源
        System.out.println("principal.class:"+principal.getClass());
        return principal.getUsername()+":"+principal.getAuthorities();
    }
}
